// 转换树形结构
// 参数 + 逻辑处理 + 返回值
// 参数：未经过任何转化的普通的后端直接返回的平铺数组
// 逻辑：树形处理逻辑
// 返回值：经过处理之后的tree数组

/**
 核心逻辑：平铺转树形 寻找父节点的过程 就是通过pid去匹配id的过程
 实施流程
   1. 遍历原数组 以数组中的每一项的id作为key 每一项本身作为value形成一个对象map [方便查找]
   2. 遍历原数组 通过pid去匹配id 如果匹配上了 就把当前项添加到匹配项的chilren属性中
      如果没有发生匹配 则代表当前项本身就是最外层的节点 它没有父节点 直接把它push到treeList中

 匹配： === 我们这里用的是一个小技巧  对象取值 如果取到了就是匹配上了
 相较于递归写法 这种写法的时间复杂度更少  O(N)的时间复杂度 也就是说它的执行时间之和要处理的数组长度相关
*/

function transTree (arr) {
  const treeList = []
  const map = {}
  arr.forEach(item => {
    map[item.id] = item
    // 初始化一个空的children数组出来
    map[item.id].children = []
  })
  arr.forEach(item => {
    if (map[item.pid]) {
      // 匹配到了
      map[item.pid].children.push(item)
    } else {
      // 没有发生匹配
      treeList.push(item)
    }
  })
  return treeList
}

export default transTree
